package com.app.oral.service

import com.app.oral.model.ExerciseRecord
import com.app.oral.model.ExerciseMode
import com.app.oral.model.ExpressionScoreDetails
import com.app.oral.model.ReadingScoreDetails
import java.math.BigDecimal

/**
 * 练习记录服务接口
 */
interface ExerciseRecordService {
    
    /**
     * 创建或获取练习记录
     */
    fun createOrGet(userId: Long, paperId: Long, mode: ExerciseMode): ExerciseRecord
    
    /**
     * 根据ID查询练习记录
     */
    fun findById(id: String): ExerciseRecord?
    
    /**
     * 根据用户ID、试卷ID和模式查询练习记录
     */
    fun findByUserPaperMode(userId: Long, paperId: Long, mode: ExerciseMode): ExerciseRecord?
    
    /**
     * 查询用户的所有练习记录
     */
    fun findByUserId(userId: Long): List<ExerciseRecord>
    
    /**
     * 查询试卷的所有练习记录
     */
    fun findByPaperId(paperId: Long): List<ExerciseRecord>
    
    /**
     * 查询已完成的练习记录
     */
    fun findCompleted(): List<ExerciseRecord>
    
    /**
     * 更新短文朗读结果
     */
    fun updateReadingResult(
        recordId: String,
        audioFileId: String,
        scoreDetails: ReadingScoreDetails
    ): ExerciseRecord?
    
    /**
     * 更新视听应答结果
     */
    fun updateListeningResult(
        recordId: String,
        listeningIndex: Int, // 1-5
        audioFileId: String,
        score: BigDecimal
    ): ExerciseRecord?
    
    /**
     * 更新情景问答结果
     */
    fun updateDialogueResult(
        recordId: String,
        dialogueIndex: Int, // 1-5
        audioFileId: String,
        score: BigDecimal
    ): ExerciseRecord?
    
    /**
     * 更新话题简述结果
     */
    fun updateExpressionResult(
        recordId: String,
        audioFileId: String,
        score: BigDecimal,
        scoreDetails: ExpressionScoreDetails
    ): ExerciseRecord?

    /**
     * 修改话题简述分数（不涉及音频文件）
     */
    fun updateExpressionScore(
        recordId: String,
        score: BigDecimal,
        scoreDetails: ExpressionScoreDetails
    ): ExerciseRecord?
    
    /**
     * 计算并更新总分
     */
    fun calculateTotalScore(recordId: String): ExerciseRecord?
    
    /**
     * 标记练习完成
     */
    fun markCompleted(recordId: String): ExerciseRecord?
    
    /**
     * 重置练习记录到初始状态
     */
    fun resetRecord(recordId: String): ExerciseRecord?
    
    /**
     * 删除练习记录
     */
    fun delete(recordId: String): Boolean
    
    /**
     * 获取用户练习统计信息
     */
    fun getUserStatistics(userId: Long): ExerciseStatistics
    
    /**
     * 获取试卷练习统计信息
     */
    fun getPaperStatistics(paperId: Long): PaperStatistics
    
    /**
     * 获取班级练习统计信息
     */
    fun getClassStatistics(classId: Long): ClassStatistics
}

/**
 * 用户练习统计数据
 */
data class ExerciseStatistics(
    val totalRecords: Int,                    // 总记录数
    val practiceRecords: Int,                 // 练习记录数
    val testRecords: Int,                     // 测试记录数
    val completedRecords: Int,                // 已完成记录数
    val averageScore: BigDecimal?             // 平均分
)

/**
 * 试卷练习统计数据
 */
data class PaperStatistics(
    val totalAttempts: Int,                   // 总尝试次数
    val practiceAttempts: Int,                // 练习尝试次数
    val testAttempts: Int,                    // 测试尝试次数
    val completedAttempts: Int,               // 已完成次数
    val averageScore: BigDecimal?,            // 平均分
    val highestScore: BigDecimal?             // 最高分
)

/**
 * 班级练习统计数据
 */
data class ClassStatistics(
    val totalStudents: Int,                   // 班级总学生数
    val activeStudents: Int,                  // 有练习记录的学生数
    val totalRecords: Int,                    // 班级总记录数
    val completedRecords: Int,                // 已完成记录数
    val practiceRecords: Int,                 // 练习记录数
    val testRecords: Int,                     // 测试记录数
    val averageScore: BigDecimal?             // 班级平均分
)